/**
 * 设置通用的CORS头部
 * @param {Object} res - Next.js响应对象
 */
function setCorsHeaders(res) {
  res.setHeader('Access-Control-Allow-Credentials', true)
  res.setHeader('Access-Control-Allow-Origin', '*')
  res.setHeader('Access-Control-Allow-Methods', 'GET,DELETE,PATCH,POST,PUT')
  res.setHeader(
    'Access-Control-Allow-Headers',
    'X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, Content-Type, Date, X-Api-Version, Authorization'
  )
}

/**
 * 处理OPTIONS预检请求
 * @param {Object} req - Next.js请求对象
 * @param {Object} res - Next.js响应对象
 * @returns {boolean} 如果是OPTIONS请求返回true，否则返回false
 */
function handleOptionsRequest(req, res) {
  if (req.method === 'OPTIONS') {
    setCorsHeaders(res)
    res.status(200).end()
    return true
  }
  return false
}

/**
 * 通用的API处理器包装器
 * @param {Function} handler - API处理函数
 * @param {Array} allowedMethods - 允许的HTTP方法，默认为['GET']
 * @returns {Function} 包装后的处理器
 */
function withCors(handler, allowedMethods = ['GET']) {
  return async function(req, res) {
    // 设置CORS头部
    setCorsHeaders(res)
    
    // 处理OPTIONS预检请求
    if (handleOptionsRequest(req, res)) {
      return
    }
    
    // 检查HTTP方法
    if (!allowedMethods.includes(req.method)) {
      const { error, handleResponse } = require('./response')
      return handleResponse(res, error('Method not allowed', 405))
    }
    
    // 调用实际的处理器
    return handler(req, res)
  }
}

module.exports = {
  setCorsHeaders,
  handleOptionsRequest,
  withCors
}